home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-06-27 | 3.4 KB | 184 lines | [TEXT/CWIE] |
- // =======================================================================
- // 3D Class Library, © Xilex Group
- // - ------------------------------------------------------------------- -
- // Written by Dmitry Boldyrev/Kirill Medvinsky
- // =======================================================================
- #pragma once
-
- #include "types.h"
-
- class ListNode
- {
- public:
- /* .. */
- protected:
- ListNode* mNextNode;
- ListNode* mPrevNode;
- };
-
- class LinkList
- {
- friend class ListNode;
- public:
- inline LinkList()
- { ForgetNodes(); }
-
- inline ~LinkList()
- { FreeNodes(); }
-
- inline void FreeNodes(void)
- {
- ListNode* nextNode;
-
- mCurrNode = mHead;
- while (mCurrNode)
- {
- nextNode = mCurrNode->mNextNode;
- delete mCurrNode;
- mCurrNode = nextNode;
- }
- ForgetNodes();
- }
-
- inline void ForgetNodes(void)
- {
- mNumNodes = 0;
- mHead = NULL;
- mTail = NULL;
- mCurrNode = NULL;
- }
-
- inline ListNode* AppendNode(ListNode* inNode)
- {
- inNode->mPrevNode = mTail;
- inNode->mNextNode = NULL;
-
- if (mTail == NULL) {
- mHead = inNode;
- } else {
- mTail->mNextNode = inNode;
- }
- mTail = inNode;
- mCurrNode = inNode;
- mNumNodes++;
-
- return inNode;
- }
-
- inline ListNode* InsertNode(ListNode* beforeNode, ListNode* inNode)
- {
- inNode->mPrevNode = beforeNode->mPrevNode;
- inNode->mNextNode = beforeNode;
- beforeNode->mPrevNode = inNode;
-
- if (beforeNode == mHead) {
- mHead = inNode;
- } else {
- inNode->mPrevNode->mNextNode = inNode;
- }
- mCurrNode = inNode;
- mNumNodes++;
-
- return inNode;
- }
-
- inline ListNode* RemoveNode(ListNode* inNode, BOOL doDisposeIt)
- {
- if (inNode == mTail) {
- mTail = inNode->mPrevNode;
- }
- if (inNode == mHead) {
- mHead = inNode->mNextNode;
- }
-
- if(inNode->mPrevNode) {
- inNode->mPrevNode->mNextNode = inNode->mNextNode;
- }
- if (inNode->mNextNode) {
- inNode->mNextNode->mPrevNode = inNode->mPrevNode;
- }
- if (doDisposeIt) {
- delete inNode;
- inNode = NULL;
- }
- mNumNodes--;
- return inNode;
- }
-
- inline void GoToFirstNode(void)
- { mCurrNode = mHead; }
-
- inline void GoToLastNode(void)
- { mCurrNode = mTail; }
-
- inline ListNode* GetNextNode(void)
- {
- ListNode* nextNode;
-
- nextNode = mCurrNode;
- if (mCurrNode) {
- mCurrNode = mCurrNode->mNextNode;
- }
- return nextNode;
- }
-
- inline ListNode* GetPrevNode(void)
- {
- ListNode* prevNode;
-
- prevNode = mCurrNode;
- if (mCurrNode) {
- mCurrNode = mCurrNode->mPrevNode;
- }
- return prevNode;
- }
-
- inline ListNode* GetLastNode(void)
- { return mTail; }
-
- inline ListNode* GetFirstNode(void)
- { return mHead; }
-
- inline WORD NumNodes(void)
- { return mNumNodes; }
-
- inline BOOL IsEmpty(void)
- { return mNumNodes <= 0; }
-
- inline BOOL IsMyNode(ListNode* inNode)
- {
- mCurrNode = mHead;
- while (mCurrNode)
- {
- if (inNode == mCurrNode)
- return TRUE;
- mCurrNode = mCurrNode->mNextNode;
- }
- return FALSE;
- }
-
- protected:
- ListNode* mHead;
- ListNode* mTail;
- ListNode* mCurrNode;
-
- WORD mNumNodes;
- };
-
- class Stack
- {
- public:
- inline void push(ListNode *data)
- { stack.AppendNode(data); }
-
- inline ListNode *pop()
- { return stack.RemoveNode(stack.GetLastNode(), FALSE); }
-
- inline BOOL empty()
- { return stack.IsEmpty(); }
- protected:
- LinkList stack;
- };
-
-
-